﻿using BUGCOME.Model.Common;
using BUGCOME.Model.Common.dto;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BUGCOME.Service.Common.IServices
{
    /// <summary>
    /// 字典数据服务接口，提供字典数据的查询、更新等操作
    /// </summary>
    public interface IDictDataService : IBaseService<DictData>
    {
        /// <summary>
        /// 异步根据 ID 数组删除字典数据，返回受影响行数
        /// </summary>
        /// <param name="dictCodes"></param>
        /// <returns></returns>
        Task<long> DeleteDictDataByIdsAsync(long[] dictCodes);

        /// <summary>
        /// 异步插入字典数据，返回插入的 ID
        /// </summary>
        /// <param name="dict"></param>
        /// <returns></returns>
        Task<long> InsertDictDataAsync(DictData dict);

        /// <summary>
        /// 根据自定义SQL查询字典数据
        /// </summary>
        /// <param name="dictInfo">包含自定义SQL的字典类型信息对象</param>
        /// <returns>查询到的字典数据集合（ IEnumerable&lt;DictDataDto&gt; ）</returns>
        Task<List<DictData>> SelectDictDataByCustomSqlAsync(DictType dictInfo);

        /// <summary>
        ///  异步根据 ID 查询字典数据（带缓存机制）
        /// </summary>
        /// <param name="id"> 参数 id：要查询的字典数据 ID</param>
        /// <returns>逻辑：生成缓存键 CK，检查缓存中是否存在对应数据；若不存在则从数据源查询并缓存 5 单位时长，最终返回结果</returns>
        Task<DictData> SelectDictDataByIdAsync(long id);

        /// <summary>
        /// 异步根据字典类型查询字典数据列表
        /// </summary>
        /// <param name="dictType">字典类型标识（例如：sys_normal_disable、sys_yes_no 等）</param>
        /// <returns>包含字典数据的异步任务（Task），任务结果为 DictData 实体列表</returns>
        Task<List<DictData>> SelectDictDataByTypeAsync(string dictType);

        /// <summary>
        /// 根据字典类型列表批量查询字典数据
        /// </summary>
        /// <param name="dicts">待查询的字典类型字符串列表</param>
        /// <returns>包含所有匹配类型的字典数据列表（ List&lt;DictDataDto&gt; ）</returns>
        Task<List<DictData>> SelectDictDataByTypesAsync(List<string> dicts);

        /// <summary>异步查询字典数据分页列表</summary>
        /// <param name="dto">查询条件与分页参数DTO</param>
        /// <returns>分页字典数据任务</returns>
        Task<PagedInfo<DictData>> SelectDictDataListAsync(DictDataQueryDto dto);

        /// <summary>
        /// 异步更新字典数据，返回受影响行数
        /// </summary>
        /// <param name="dict"></param>
        /// <returns></returns>
        Task<long> UpdateDictDataAsync(DictData dict);

        /// <summary>
        /// 更新字典类型（将旧字典类型替换为新字典类型）
        /// </summary>
        /// <param name="oldDictType">待替换的旧字典类型字符串</param>
        /// <param name="newDictType">替换后的新字典类型字符串</param>
        /// <returns>更新操作影响的记录数（int），即成功替换的字典数据条数</returns>
        Task<int> UpdateDictDataTypeAsync(string oldDictType, string newDictType);
    }
}